package com.jiang.service;

import com.jiang.dao.userDao;
import com.jiang.entity.Cart;
import com.jiang.entity.Goods;
import com.jiang.entity.Type;
import com.jiang.entity.User;
import com.jiang.utlis.Constants;
import com.jiang.utlis.MD5Utils;
import com.jiang.utlis.RandomUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author jiangjingbo
 * @version V1.0
 * @Project java2203
 * @Package com.jiang.service
 * @Description:
 * @Date 2022/5/20 21:58
 */
public class Administratorimpl implements Administrator {
    private userDao userDao;

    public Administratorimpl(userDao user) {
        this.userDao = user;
    }

    @Override
    public User selectAdmin(String name ,String pwd) {
        User user = userDao.selectUser(name);
        //是否是管理员
        if (user.getRole() != Constants.ACTIVE_FAIL) {
            return null;
        }
        //是否为null
        if(user.getUsername()==null){
            return null;
        }
        //是否激活
        if(!user.getStatus().equals(Constants.HAS_USER)){
            return null;
        }
        if(!user.getPassword().equals(MD5Utils.md5(pwd))){
            return  null;
        }
        System.out.println(user);
        return user;
    }

    @Override
    public User selectUser(String name, String pwd) {
        User user = userDao.selectUser(name);
        System.out.println(user);
        if(user==null){
            return  null;
        }
        //是否是用户
        System.out.println(user);
        if(user.getRole()!=Constants.ACTIVE_SUCCESS){
            return  null;
        }
        //是否激活
        if(!user.getStatus().equals(Constants.HAS_USER)){
            return null;
        }
        if(user.getPassword().equals(MD5Utils.md5(pwd))){
            return user;
        }
        return null;
    }
    //用户名存在
    @Override
    public boolean selectOne(String name) {
        User user = userDao.selectUser(name);
        if(user!=null){
            return  true;
        }else{
            return  false;
        }
    }
    //添加用户
    @Override
    public boolean adduser(User user) {
        //将获取的验证码进行加密
        String md5 = MD5Utils.md5(user.getPassword());
        user.setPassword(md5);
        //设置会员会员为激活的状态  激活1
        user.setStatus(Constants.USER_ACTIVE);
        //3. 初始化用户角色为普通用户  用户1
        user.setRole(Constants.ACTIVE_SUCCESS);
        //4. 初始化, 消费者随机激活码
        user.setCode(RandomUtils.createActive());
        //5. 调用dao完成添加功能
        int adduser = userDao.Adduser(user);
        if(adduser>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 查询所有商品分类数据
     * @return
     */
    @Override
    public List<Type> findAllType() {
        List<Type> all = userDao.findAll();
        System.out.println("=====查询所有商品分类数据======"+all);
        return  all;

    }

    /**
     * 产看所有的商品
     * @return
     */
    @Override
    public List<Goods> findAllgoods() {
        List<Goods> goods = userDao.goodsAll();
        return goods;
    }

    /**
     * 添加商品
     * @param goods
     * @return
     */
    @Override
    public boolean AddGoods(Goods goods) {
        return  userDao.Addgoods(goods)!=0;

    }

    /**
     * 根据商品id 查询详细信息
     * @param id
     * @return
     */
    @Override
    public Goods FindGoodsID(Integer id) {
        Goods goodsID = userDao.findGoodsID(id);
        return goodsID;
    }

    /**
     * 根据id 查找购物车id
     * @param uid  用户id
     * @param pid  商品主键id
     * @return
     */
    @Override
    public boolean findCidPid(Integer pid, Integer uid) {
        //调用DAO层 查询数据库是否有相关的数据
        Cart cidPid = userDao.findCidPid(pid, uid);
        System.out.println("======第一个cidpid===="+cidPid);
        //用商品ID查询商品相关信息
        Goods goods = userDao.findGoodsID(pid);

        if (cidPid!=null){
            //如果购物车不为空那就对元数据进行修改
            //2. 判断如果能够查询到这个购物项数据, 进行购买数量的添加
            //购买件数+1
            cidPid.setNum(cidPid.getNum()+1);
            //将商品对象放入购物车中
            cidPid.setGoods(goods);
            //从新计算总价钱 = 商品的购买数量 * 商品单价
            cidPid.setMoney(cidPid.getNum()*goods.getPrice());

            //调用dao, 将最新的购物车数据更新到表中
            userDao.updateCatr(cidPid);
        }else{
            //如果购物车没有查到相关数据,那么就对进行添加
            //1. 根据用户id和商品id, 到数据库中查询是否已经有这个商品的数据
            cidPid = new Cart();
            //用户id
            cidPid.setUid(uid);
            //商品id
            cidPid.setPid(pid);
            //将商品对象家人购物车
            cidPid.setGoods(goods);
            //商品数量
            cidPid.setNum(cidPid.getNum()+1);
            //商品价格等于  数量 * 商品价格
            cidPid.setMoney(cidPid.getNum()*goods.getPrice());
            //调用Dao层 进行添加数据
            System.out.println("=========第二个cidPid=========="+cidPid);
            userDao.AddCartOne(cidPid);

        }
        return true;
    }

    /**
     * 查根据用户展示购物车的内容
     * @param uid
     * @return
     */
    @Override
    public List<Cart> findCartListByUid(Integer uid) {

        //查询所有商品数据
        List<Goods> goods = userDao.goodsAll();

        //以商品id作为key, 以商品对象作为value
        Map<String ,Goods> map =new HashMap<>();
        if(goods!=null){
            for (Goods good : goods) {
                map.put(String.valueOf(good.getId()),good);
            }
        }
        //根据用户id, 查询购物项集合
        List<Cart> cart = userDao.findUidCart(uid);
        if(cart!=null){

            for (Cart cart1 : cart) {
                //根据购物车集合 用商品id作为key 查找 value的商品对象
                Goods goods1 = map.get(String.valueOf(cart1.getPid()));
                //如果商品对象不为空, 那么放入购物车对象中
                if(goods1!=null){
                    //将查询到商品对象放到 cart中
                    cart1.setGoods(goods1);
                }
            } 
        }

        return cart;
    }

    /**
     * 根购物车id修改购物车中的数量
     * @param cid
     * @param cnum
     */
    @Override
    public void updateCart(Integer cid, Integer cnum) {
        //1. 根据cid, 到数据库查询这个购物项的数据
        Cart cart = userDao.insertCartOne(cid);
        //2. 根据查询到的购物项的, 商品id, 到商品表中查询对应的商品数据
        Goods goods = userDao.insertGoodstOne(cart.getPid());

        //3. 从新计算总价 = 商品单价 * 商品购买数量
        cart.setNum(cnum);
        cart.setGoods(goods);
        cart.setMoney(goods.getPrice()*cnum);
        //将修改完成的购物车数据放到Dao中在数据库中进行修改
        userDao.updateCatr(cart);
    }

    /**
     * 根据购物车id删除相关数据
     * @param cid
     */
    @Override
    public void deleteCart(Integer cid) {
        userDao.DeleteCatr(cid);
    }


}
